home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_oth
/
ada
/
augusta.bas
< prev
next >
Wrap
BASIC Source File
|
1986-06-09
|
25KB
|
468 lines
1 ' **************************************
2 ' * *
3 ' * Augusta.bas - a public domain *
4 ' * subset of the US Department of *
5 ' * Defense computer language Ada. *
6 ' * *
7 ' **************************************
8 '
10 '
100 '
1000 DEFINT A-Z:CLS:KEY OFF:PRINT"Augusta(tm) Compiler v1.1A":PRINT"(C) Copyright 1983 by Computer Linguistics":PRINT"All rights reserved."
1003 DIM MAP(26),KEYWD$(33),S$(100),TY(20),B$(3),B(3),S(500)
1010 PRINT:PRINT"Initializing ...":GOSUB 1780:GOSUB 1110:SI=1:PRINT:INPUT"Source file ? ",S$:GOSUB 1230
1020 INPUT"Code file ? ",C$:OPEN"R",#1,C$,128:CLOSE 1:KILL C$
1040 INPUT"Listing (Y/CR)? ",T1$:OPEN"R",#1,C$,128:R0=16:M0=R0:IF T1$="Y" THEN PLST=-1:LPRINT LP$;
1050 GOSUB 1290:GOSUB 1400:PRINT FRE("");" Bytes for symbols":GOSUB 1980
1060 PUT #1,R0:FIELD #1,2 AS T1$,2 AS T2$,2 AS T3$,2 AS D$,2 AS S$
1070 LSET T1$=MKI$(GC):LSET T2$=MKI$(M0):LSET T3$=MKI$(PROC):LSET D$=MKI$(0):LSET S$=MKI$(1113)
1080 PUT #1,1:FIELD #1,128 AS D$:FOR I=1 TO MB:IF B(I)<>0 AND B(I)<>R0 THEN LSET D$=B$(I):PUT #1,B(I)
1090 NEXT I:CLOSE 1:PRINT:PRINT"Compiled OK":PRINT LN;" LINES. ";GC-1920;" bytes":GOTO 32767
1110 ' ********* Init
1120 QUOTE$=CHR$(34):LEXCH$=ALF$+DIG$+" @*+=-<>/:;')(,"+QUOTE$+".#!"+CHR$(3)+CHR$(96)+CHR$(9):CLST=-1
1130 SQUOTE=0:EOL=1:C=2:LP=3:RP=4:MUL=5:DIV=6:ADD=7:SUBT=8:LES=9:LEQ=10:GT=11:GEQ=12:EQ=13:NEQ=14:BAR=15:ID=16
1135 SC=17:COMMA=18:SEMICOLON=19:COLON=20:EQGT=21:COLONEQ=22:DOT=23:DOTDOT=24:CH=25:AT=26
1140 KAND=27:KARRAY=28:KBEGIN=29:KCASE=30:KCONST=31:KDECLARE=32:KELSE=33:KELSEIF=34:KEND=35:KEXIT=36:KFOR=37:KFUNC=38:KIF=39
1145 KIN=40:KIS=41:KLOOP=42:KLAST=43:KLEN=44:KMOD=45:KNOT=46:KNULL=47:KOF=48:KOR=49:KOTHERS=50:KOUT=51
1150 KPRAGMA=52:KPROC=53:KRET=54:KREVERSE=55:KTHEN=56:KWHEN=57:KWHILE=58
1160 ADDOP$=CHR$(ADD)+CHR$(SUBT):MULOP$=CHR$(MUL)+CHR$(DIV)+CHR$(KMOD):LOGICALOP$=CHR$(KAND)+CHR$(KOR)
1165 UNARYOP$=CHR$(ADD)+CHR$(SUBT)+CHR$(KNOT):RELOP$=CHR$(LES)+CHR$(LEQ)+CHR$(GT)+CHR$(GEQ)+CHR$(EQ)+CHR$(NEQ)
1170 DECLPART$=CHR$(ID)+CHR$(KPROC)+CHR$(KFUNC)+CHR$(KPRAGMA)
1180 STMT$=CHR$(KWHILE)+CHR$(KFOR)+CHR$(KLOOP)+CHR$(KDECLARE)+CHR$(KBEGIN)+CHR$(KEXIT)+CHR$(KRET)+CHR$(KIF)
1185 STMT$=STMT$+CHR$(KCASE)+CHR$(KNULL)+CHR$(ID)+CHR$(PRAGMA)
1190 LN=1:EOI=0:LL=0:CPROC=0:PROC=0:GC=1920:VLOC=VARPTR(V):VLOC1=VLOC+1:TSTR=0:TINT=1:TCHR=2:TBOL=4:FMSZ=14
1200 PLDCI=1:PLDL=2:PLLA=3:PLDB=4:PLDO=5:PLAO=6:PDUP=7:PLOD=8:PLDA=9:PPOP=10:PSTO=11:PSINDO=12:PLCA=13:PSAS=14:PAND=16
1205 POR=17:PNOT=18:PADI=19:PNGI=20:PSBI=21:PMPI=22:PDVI=23:PIND=24:PEQUI=25:PNEQI=26:PLEQI=27:PSLDC=61:PINCL=80:PDECL=81
1210 PLESI=28:PGEQI=29:PGTRI=30:PEQUSTR=31:PNEQSTR=32:PLEQSTR=33:PLESSTR=34:PGEQSTR=35:PGTRSTR=36:PUJP=37:PFJP=38:PXJP=39
1215 PCLP=40:PCGP=41:PCSP=42:PRET=43:PMODI=45:PCIP=46:PRNP=47:PEOP=15:PSLDCN1=63:PIXA=48
1217 PSLDO=57:PSLAO=58:PSLLA=59:PSLDLO=49:PSLDL=60
1220 RETURN
1230 '********** Open Source
1240 SI=SI+1:OPEN"I",#SI,S$:RETURN
1250 '********** Convert to UPPERCASE
1260 IF INSTR(LC$,CH$) THEN CH$=CHR$(ASC(CH$)-32)
1270 RETURN
1280 '********** GetLine
1290 LN=LN+1:IF EOF(SI) THEN CLOSE SI:SI=SI-1:IF SI>1 AND PLST THEN LPRINT TAB(26);"* End of INCLUDE"
1300 IF SI=1 THEN EOI=-1:RETURN
1310 LINE INPUT #SI,BUF$
1320 IF PLST=0 THEN GOTO 1330 ELSE LPRINT USING"##### #### ###### ###### ";LN,CPROC,CP,OFST;:LPRINT LEFT$(BUF$,54)
1325 IF (LN MOD 60)=0 THEN LPRINT CHR$(12);:LPRINT:LPRINT
1330 IF CLST<>0 THEN PRINT BUF$ ELSE IF (LN AND 63)=63 THEN PRINT LN;"..."
1340 IF LEN(BUF$)=0 THEN 1290 ELSE BUF$=BUF$+CHR$(3):B=1:WHILE MID$(BUF$,B,1)=" ":B=B+1:WEND:CH$=MID$(BUF$,B,1):B=B+1:RETURN
1360 '********** GetCh
1370 LSET CH$=MID$(BUF$,B,1):B=B+1:RETURN
1380 B=B+1
1390 RETURN
1400 '********** GetSym
1410 OLDB=B:GOSUB 1250:I=INSTR(LEXCH$,CH$):IF I=0 THEN E=1:GOTO 5020
1420 IF I<27 THEN GOSUB 1460:GOTO 1430
1423 IF I<42 THEN ON I-26 GOSUB 1500,1500,1500,1500,1500,1500,1500,1500,1500,1500,1700,1770,1720,1520,1600:GOTO 1430
1427 ON I-41 GOSUB 1530,1620,1640,1660,1680,1540,1750,1570,1560,1550,1730,1580,1695,1710,1450,1440,1775
1430 IF EOI THEN E=12:GOTO 5020 ELSE IF OLDB=B THEN 1410 ELSE LSET TT$=CHR$(T):RETURN
1440 T=SQUOTE:GOSUB 1360:RETURN
1450 GOSUB 1290:OLDB=B:RETURN
1460 S$="":WHILE INSTR(AN$,CH$):IF CH$<>"_" THEN S$=S$+CH$
1470 GOSUB 1370:GOSUB 1260:WEND:IF LEN(S$)>8 THEN S$=LEFT$(S$,8)
1480 ID$=S$+SPACE$(8-LEN(S$)):GOSUB 1890:RETURN
1490 '********** Digits
1500 TN=0:I1=10
1510 WHILE INSTR(HDIG$,CH$):TN=TN*I1+INSTR(HDIG$,CH$)-1:GOSUB 1360:WEND
1515 IF CH$="#" THEN I1=TN:TN=0:GOSUB 1360:GOTO 1510 ELSE T=C:RETURN
1520 T=ADD:GOSUB 1360:RETURN
1530 T=SUBT:GOSUB 1360:IF CH$="-" THEN GOSUB 1280:OLDB=B:RETURN ELSE RETURN
1540 T=SEMICOLON:GOSUB 1360:RETURN
1550 T=COMMA:GOSUB 1360:RETURN
1560 T=LP:GOSUB 1360:RETURN
1570 T=RP:GOSUB 1360:RETURN
1580 T=DOT:GOSUB 1360:IF CH$="." THEN T=DOTDOT:GOSUB 1360
1590 RETURN
1600 GOSUB 1360:IF CH$=">" THEN T=EQGT:GOSUB 1360 ELSE T=EQ
1610 RETURN
1620 GOSUB 1360:IF CH$="=" THEN T=LEQ:GOSUB 1360 ELSE T=LES
1630 RETURN
1640 GOSUB 1360:IF CH$="=" THEN T=GEQ:GOSUB 1360 ELSE T=GT
1650 RETURN
1660 GOSUB 1360:IF CH$="=" THEN T=NEQ:GOSUB 1360 ELSE T=DIV
1670 RETURN
1680 GOSUB 1360:IF CH$="=" THEN T=COLONEQ:GOSUB 1360 ELSE T=COLON
1690 RETURN
1695 T=BAR:GOSUB 1360:RETURN
1700 WHILE CH$=" ":LSET CH$=MID$(BUF$,B,1):B=B+1:WEND:OLDB=B:RETURN
1710 T=BAR:GOSUB 1360:RETURN
1720 T=MUL:GOSUB 1360:RETURN
1730 I1=INSTR(B,BUF$,QUOTE$):IF I1=0 THEN E=10:GOTO 5020
1740 S$=MID$(BUF$,B,I1-B):T=SC:B=I1+1:GOSUB 1360:RETURN
1750 GOSUB 1360:GOSUB 1360:IF CH$<>"'" THEN E=11:GOTO 5020
1760 GOSUB 1360:GOSUB 1930:TN=ASC(MID$(S$,2,1)):T=CH:RETURN
1770 T=AT:GOSUB 1360:RETURN
1775 GOSUB 1360:OLDB=B:RETURN
1780 '********** Read Data
1790 CH$=" ":B=0:LB=0:AN$=CH$:LC$=CH$:S$=CH$:T=0:T0=0:X=0:SP=0:TSP=0:LEXCH$=S$:CP=0:CB=0:W=0:I=0:R2=0:R1=0:T3=0:R0=16
1795 D$=S$:LOC1=0:LOC2=0:V=0:VLOC=0:VLOC1=0:TN=0:TT$=S$:HASH=0:ID$=S$:BUF$=S$:T1=0:T2=0
1800 NKEY=33:SSP=1:MB=3:FOR I=0 TO MB:B$(I)=SPACE$(128):B(I)=0:NEXT I
1820 OPEN"I",#1,"keywords.txt":LINE INPUT #1,LC$:T1=1:WHILE T1>0:INPUT #1,T1:LP$=LP$+CHR$(T1):WEND
1830 INPUT #1,DIG$,HDIG$,ALF$,LC$,AN$
1840 FOR I=1 TO 26:INPUT #1,MAP(I):NEXT I
1850 I=1:INPUT #1,ID$,TYPE,KIND,PINFO,CONST,OBJSZ,ADDR,LL:IF ID$<>"*END*" THEN ID$=ID$+SPACE$(8-LEN(ID$)):GOSUB 3850:GOTO 1850
1860 IF EOF(1) THEN 1880 ELSE INPUT #1,T$:IF LEN(T$)>8 THEN T$=LEFT$(T$,8)
1870 T$=T$+SPACE$(8-LEN(T$)):KEYWD$(I)=T$:I=I+1:GOTO 1860
1880 CLOSE 1:KEYWD$(0)=" ":KEYWD$(NKEY)=" ":RETURN
1890 '********** LookupKeyword
1900 HASH=MAP(INSTR(ALF$,LEFT$(ID$,1)))
1910 IF KEYWD$(HASH)=ID$ THEN T=HASH+26 ELSE IF ASC(KEYWD$(HASH))<>ASC(ID$) THEN T=ID ELSE HASH=HASH+1:GOTO 1910
1920 RETURN
1930 '********** Get S$
1940 S$=MID$(BUF$,OLDB-1,B-OLDB):RETURN
1950 IF T0=T THEN RETURN
1955 E=4:GOSUB 5110:PRINT"Reenter+ ";:LINE INPUT T$:BUF$=LEFT$(BUF$,B-1)+T$+CHR$(3):GOSUB 1360:GOSUB 1400:GOTO 1950
1960 IF T0=T THEN GOSUB 1400:RETURN ELSE GOSUB 1950:GOSUB 1400:RETURN
1970 '********** Compilation
1980 GOSUB 2770
1990 IF T=KPROC THEN GOSUB 1400:GOSUB 2010:T0=SEMICOLON:GOSUB 1950
2000 RETURN
2010 '********** Parse Proc
2020 GOSUB 5200
2030 KIND=2:PROC=PROC+1:CPROC=PROC:ADDR=PROC:X=ADDR:GOSUB 4280:GOSUB 3850:GOSUB 1400
2040 OFST=-FMSZ:IF T=KIS THEN 2060
2050 GOSUB 2100:T0=KIS:GOSUB 1950
2060 '********** Is
2070 X=-(OFST+FMSZ):GOSUB 4280:GOSUB 1400:OFST=0:MXOF=0:GOSUB 2440:W=PRET:GOSUB 3990:GOSUB 5300:RETURN
2100 '********** ProcFormalPart
2110 T2$="":T0=LP:GOSUB 1960
2120 GOSUB 2160:IF T=SEMICOLON THEN GOSUB 1400:GOTO 2120
2130 T0=RP:GOSUB 1960:FOR I=OFST TO-FMSZ-2 STEP 2:T1$=LEFT$(T2$,17):T2$=MID$(T2$,18):IF LEN(S$(SSP))+17)>255 THEN SSP=SSP+1
2140 S$(SSP)=LEFT$(T1$,14)+MKI$(I)+RIGHT$(T1$,1)+S$(SSP):NEXT I
2150 RETURN
2160 '********** ProcParamDecl
2170 T1$=""
2180 T0=ID:GOSUB 1950:T1$=T1$+ID$:GOSUB 1400
2190 IF T=COMMA THEN GOSUB 1400:GOTO 2180
2200 T0=COLON:GOSUB 1960:P1=1:IF T=KOUT THEN P1=2:GOSUB 1400:GOTO 2220
2210 IF T=KIN THEN GOSUB 1400
2220 GOSUB 2250:PINFO=P1
2230 WHILE LEN(T1$)>0:T2$=T2$+LEFT$(T1$,8)+CHR$(TYPE)+CHR$(KIND)+CHR$(PINFO)+MKI$(CONST)+CHR$(OBJSZ)+MKI$(0)+CHR$(LL)
2235 T1$=MID$(T1$,9):OFST=OFST-2:WEND
2240 RETURN
2250 '********** SubtypeIdentificationUnit
2260 GOSUB 3890:IF KIND<>4 THEN E=8:GOTO 5020 ELSE IF PINFO=0 THEN KIND=1 ELSE KIND=5
2280 IF TYPE<>0 THEN GOSUB 1400:RETURN
2285 GOSUB 2300:IF OBJSZ>255 THEN E=15:GOTO 5020 ELSE RETURN
2290 '********** Get C
2293 IF T<>ID THEN GOTO 2297 ELSE T8=TYPE:T3=KIND:T4=PINFO:T5=CONST:T6=OBJSZ:T7=LL
2294 GOSUB 3890:IF KIND=0 AND TYPE=1 THEN T=C:T2=CONST
2295 TYPE=T8:KIND=T3:PINFO=T4:CONST=T5:OBJSZ=T6:LL=T7
2297 T0=C:GOSUB 1960:RETURN
2300 '********** ObjSz
2310 GOSUB 1400:IF T<>LP THEN 2330 ELSE GOSUB 1400
2320 GOSUB 2290:OBJSZ=TN+1:T0=RP:GOSUB 1960
2330 RETURN
2340 '********** ParseFunc
2350 GOSUB 5200:KIND=3:PROC=PROC+1:CPROC=PROC:ADDR=PROC:X=ADDR:GOSUB 4280:GOSUB 3850:X=SSP:GOSUB 4280:X=LEN(S$(SSP))
2355 GOSUB 4280:GOSUB 1400
2370 OFST=-FMSZ:IF T=LP THEN GOSUB 2100
2380 T0=KRET:GOSUB 1960:GOSUB 2250:GOSUB 4300:T2=X:GOSUB 4300:T1=X:T3=LEN(S$(T1)):IF KIND<>5 OR OBJSZ<>2 THEN E=16:GOTO 5020
2385 S$(T1)=LEFT$(S$(T1),T3-T2+8)+CHR$(TYPE)+MID$(S$(T1),T3-T2+10)
2400 T0=KIS:GOSUB 1960
2410 X=-(OFST+FMSZ):GOSUB 4280:OFST=0:MXOF=0:GOSUB 2440:GOSUB 5300:RETURN
2440 '********** BodyPart
2450 IF INSTR(DECLPART$,TT$) THEN GOSUB 2480
2460 CB=GC:CP=0:GOSUB 2790
2470 RETURN
2480 '********** DeclPart
2490 IF T=ID THEN T1$=ID$:K1=5:GOSUB 2560:GOTO 2540
2500 IF T=KPROC THEN GOSUB 1400:GOSUB 2010:GOTO 2540
2510 IF T=KFUNC THEN GOSUB 1400:GOSUB 2340:GOTO 2540
2520 IF T=KPRAGMA THEN GOSUB 2770:GOTO 2550
2530 E=3:GOTO 5020
2540 GOSUB 3420
2550 IF INSTR(DECLPART$,TT$) THEN 2480 ELSE GOSUB 4990:RETURN
2560 '********** ObjDecl
2570 GOSUB 1400
2580 IF T=COMMA THEN GOSUB 1400:T0=ID:GOSUB 1950:T1$=T1$+ID$:GOTO 2570
2590 T0=COLON:GOSUB 1960
2600 IF T=KCONST THEN 2650
2610 IF T=KARRAY THEN 2700
2620 GOSUB 2250:OBJSIZE=OBJSZ
2630 PINFO=0:KIND=K1:WHILE LEN(T1$)>0:ID$=LEFT$(T1$,8):T1$=MID$(T1$,9):ADDR=OFST:OFST=OFST+OBJSIZE:GOSUB 3850:WEND
2640 RETURN
2650 '********** Constant
2670 K1=0:OBJSIZE=0:GOSUB 1400:T0=COLONEQ:GOSUB 1960:IF T=ID THEN GOSUB 3890:GOTO 2690 ELSE IF T=SUBT THEN T1=-1:GOSUB 1400 ELSE T1=1
2680 CONST=TN*T1:IF T=C THEN TYPE=1 ELSE TYPE=2
2690 GOSUB 1400:GOTO 2630
2700 '********** Array
2710 K1=1:GOSUB 1400:T0=LP:GOSUB 1960:T2=TN:GOSUB 2290:T0=RP:GOSUB 1960:T0=KOF:GOSUB 1960
2750 GOSUB 2250:CONST=T2:OBJSIZE=(T2+1)*OBJSZ:IF T2<0 OR T2>16383 THEN E=15:GOTO 5020 ELSE 2630
2770 '********** Pragma
2780 IF T<>KPRAGMA THEN RETURN ELSE GOSUB 4830:GOSUB 1280:GOSUB 1400:GOTO 2780
2790 '********** Stmt
2800 T0=KBEGIN:GOSUB 1960:GOSUB 2810:T0=KEND:GOSUB 1960:RETURN
2810 '********** SeqOfStmts
2820 I=INSTR(STMT$,TT$)
2825 IF I=0 THEN RETURN ELSE ON I GOSUB 4320,4320,4320,2850,2850,2890,2930,2970,4630,2830,3440,2770:GOTO 2820
2830 '********** Null
2840 GOSUB 1400:GOSUB 3420:RETURN
2850 '********** Block
2860 X=OFST:GOSUB 4280:OFST=OFST+2:GOSUB 5400:IF T=KDECLARE THEN GOSUB 1400:GOSUB 2480
2880 GOSUB 2790:GOSUB 5500:GOSUB 5700:GOSUB 4300:OFST=X:GOSUB 3420:RETURN
2890 '********** Exit
2900 IF LPFLG=0 THEN E=14:GOTO 5020
2910 GOSUB 1400:IF T=SEMICOLON THEN W=PUJP:GOSUB 3990:GOTO 2925
2920 T0=KWHEN:GOSUB 1960:GOSUB 3100:GOSUB 4930:W=PNOT:GOSUB 3990:W=PFJP:GOSUB 3990
2925 W=XITJP:XITJP=CP:GOSUB 4030:GOSUB 3420:RETURN
2930 '********** Return
2940 GOSUB 1400
2950 IF T<>SEMICOLON THEN GOSUB 3100:TSP=TSP-1:W=PRNP ELSE W=PRET
2960 GOSUB 3990:GOSUB 3420:RETURN
2970 '********** If
2980 LUJP=0
2990 GOSUB 1400:GOSUB 3100:GOSUB 4930:W=PFJP:GOSUB 3990:X=CP:GOSUB 4280:GOSUB 4030:X=LUJP:GOSUB 4280
2995 T0=KTHEN:GOSUB 1960:GOSUB 2810:GOSUB 4300:LUJP=X
3000 IF T=KEND THEN GOSUB 3040:GOTO 3030
3010 IF T=KELSEIF THEN GOSUB 3060:GOSUB 3040:GOTO 2990
3020 T0=KELSE:GOSUB 1960:GOSUB 3060:GOSUB 3040:X=LUJP:GOSUB 4280:GOSUB 2810:GOSUB 4300:LUJP=X
3030 T0=KEND:GOSUB 1960:T0=KIF:GOSUB 1960:GOSUB 3080:GOSUB 3420:RETURN
3040 '********** Fix FJP
3050 GOSUB 4300:T1=CP:CP=X:W=T1-X-2:GOSUB 4030:CP=T1:RETURN
3060 '********** Gen UJP
3070 W=PUJP:GOSUB 3990:W=LUJP:LUJP=CP:GOSUB 4030:RETURN
3080 '********** Fixup
3090 T2=CP:WHILE LUJP<>0:CP=LUJP:GOSUB 4010:LUJP=W:W=T2-CP-2:GOSUB 4030:WEND:CP=T2:RETURN
3100 '********** Expr
3110 GOSUB 3190:LFJP=0:PREV=0
3120 IF INSTR(LOGICALOP$,TT$)=0 THEN IF PREV THEN 3180 ELSE RETURN
3125 X=T:GOSUB 1400:IF (X=KAND AND T=KTHEN) THEN X=KAND+KTHEN ELSE IF (X=KOR AND T=KELSE) THEN X=KOR+KELSE
3130 IF PREV<>0 THEN IF PREV<>X THEN E=10:GOTO 5020
3140 IF X<>KAND AND X<>KOR THEN 3160
3145 GOSUB 4280:GOSUB 3190:IF (TY(TSP)<>TBOL) OR (TY(TSP)<>TY(TSP-1)) THEN E=9:GOTO 5020
3147 TSP=TSP-1:GOSUB 4300:PREV=X:IF X=KAND THEN W=PAND ELSE W=POR
3150 GOSUB 3990:GOTO 3120
3160 GOSUB 4280:T1=X:W=PDUP:GOSUB 3990:IF T1=KAND+KTHEN THEN W=PFJP ELSE W=PNOT:GOSUB 3990:W=PFJP
3170 GOSUB 3990:W=LFJP:LFJP=CP:GOSUB 4030:GOSUB 1400:X=LFJP:GOSUB 4280:GOSUB 3190
3174 IF (TY(TSP)<>TBOL) OR (TY(TSP)<>TY(TSP-1)) THEN E=9:GOTO 5020
3175 TSP=TSP-1:GOSUB 4300:LFJP=X:GOSUB 4300:PREV=X:IF X=KAND+KTHEN THEN W=PAND ELSE W=POR
3178 GOSUB 3990:GOTO 3120
3180 T2=CP:WHILR LFJP<>0:CP=LFJP:GOSUB 4010:LFJP=W:W=T2-CP-2:GOSUB 4030:WEND:CP=T2:RETURN
3190 '********** Relation
3200 GOSUB 3300
3210 IF INSTR(RELOP$,TT$)=0 THEN RETURN
3220 X=T:GOSUB 4280:GOSUB 1400
3230 GOSUB 3290:IF TY(TSP)<>TINT AND TY(TSP)<>TCHR AND TY(TSP)<>TBOL THEN 3260
3235 IF TY(TSP)<>TY(TSP-1) THEN E=9:GOTO 5020 ELSE TSP=TSP-1:TY(TSP)=TBOL
3240 GOSUB 4300:IF X=LES THEN W=PLESI ELSE IF X=LEQ THEN W=PLEQI ELSE IF X=GT THEN W=PGTRI
3245 IF X=GEQ THEN W=PGEQI ELSE IF X=EQ THEN W=PEQUI ELSE IF X=NEQ THEN W=PNEQI
3250 GOSUB 3990:GOTO 3210
3260 IF TY(TSP)<>TSTR OR TY(TSP)<>TY(TSP-1) THEN E=9:GOTO 5020 ELSE TSP=TSP-1:TY(TSP)=TBOL
3270 GOSUB 4300:IF X=LES THEN W=PLESSTR ELSE IF X=LEQ THEN W=PLEQSTR ELSE IF X=GT THEN W=PGTRSTR
3275 IF X=GEQ THEN W=PGEQSTR ELSE IF X=EQ THEN W=PEQUSTR ELSE IF X=NEQ THEN W=PNEQSTR
3280 GOSUB 3990:GOTO 3210
3290 '********** SE
3300 IF INSTR(UNARYOP$,TT$) THEN X=T:GOSUB 4280:X=1:GOSUB 4280:GOSUB 1400 ELSE X=0:GOSUB 4280
3310 GOSUB 3350:GOSUB 4300:IF X=1 THEN GOSUB 4300:IF X=SUBT THEN W=PNGI:GOSUB 3990 ELSE W=PNOT:GOSUB 3990
3320 IF INSTR(ADDOP$,TT$)=0 THEN RETURN
3330 X=T:GOSUB 4280:GOSUB 1400:GOSUB 3350:GOSUB 4300:IF X=ADD THEN W=PADI ELSE W=PSBI
3340 IF TY(TSP)<>TINT THEN E=9:GOTO 5020 ELSE TSP=TSP-1:GOSUB 3990:GOTO 3320
3350 '********** Term
3360 GOSUB 3610
3370 IF INSTR(MULOP$,TT$)=0 THEN RETURN
3380 X=T:GOSUB 4280:GOSUB 1400:GOSUB 3610
3390 IF TY(TSP)<>TY(TSP-1) OR (TY(TSP)<>TINT) THEN E=9:GOTO 5020 ELSE TSP=TSP-1
3400 GOSUB 4300:IF X=MUL THEN W=PMPI ELSE IF X=DIV THEN W=PDVI ELSE W=PMODI
3410 GOSUB 3990:GOTO 3370
3420 '********** Skip
3430 IF T=SEMICOLON THEN GOSUB 1400:RETURN ELSE E=13:GOSUB 5110:RETURN
3440 '********** ID
3450 GOSUB 3890:IF KIND<>2 THEN X=TYPE:GOSUB 4280:GOSUB 3490:GOTO 3530 ELSE X=ADDR:GOSUB 4280:X=LEX:GOSUB 4280
3460 GOSUB 1400:IF T=SEMICOLON THEN 3480 ELSE T0=LP:GOSUB 1960
3470 GOSUB 3570:T0=RP:GOSUB 1960
3480 GOSUB 4100:GOSUB 3420:RETURN
3490 GOSUB 4060:GOSUB 1400
3500 IF KIND<>1 THEN RETURN ELSE X=OBJSZ:GOSUB 4280
3510 T0=LP:GOSUB 1960:GOSUB 3100:GOSUB 4960:GOSUB 4300:IF X=2 THEN W=PIND ELSE W=PIXA:GOSUB 3990:W=X
3520 GOSUB 3990:T0=RP:GOSUB 1960:RETURN
3530 T0=COLONEQ:GOSUB 1960
3540 GOSUB 3100:GOSUB 4300:IF NOT (X=TY(TSP) OR (X=TINT AND TY(TSP)=TBOL) OR (X=TBOL AND TY(TSP)=TINT)) THEN E=9:GOTO 5020
3550 IF X=TSTR THEN W=PSAS ELSE W=PSTO
3560 TSP=TSP-1:GOSUB 3990:GOSUB 3420:RETURN
3570 '********** ActualParam
3580 IF T=AT THEN GOSUB 1400:T0=ID:GOSUB 1950:GOSUB 3890:GOSUB 3490 ELSE GOSUB 3100:TSP=TSP-1
3590 IF T=COMMA THEN GOSUB 1400:GOTO 3580
3600 RETURN
3610 '********** Primary
3620 IF T=LP THEN GOSUB 1400:GOSUB 3100:T0=RP:GOSUB 1960:RETURN
3630 IF T=C THEN TSP=TSP+1:TY(TSP)=TINT:GOSUB 3640:GOSUB 1400:RETURN
3633 IF T=CH THEN TSP=TSP+1:TY(TSP)=TCHR:GOSUB 3640:GOSUB 1400:RETURN ELSE 3650
3635 '********** LD Cons
3640 IF TN=-1 THEN W=PSLDCN1:GOTO 3645 ELSE IF TN>-1 AND TN<16 THEN W=64+TN:GOTO 3645
3643 IF TN>0 AND TN<256 THEN W=PSLDC:GOSUB 3990:W=TN:GOSUB 3990:RETURN ELSE W=PLDCI:GOSUB 3990:W=TN:GOSUB 4030:RETURN
3645 GOSUB 3990:RETURN
3650 IF T<>SC THEN 3670 ELSE TSP=TSP+1:TY(TSP)=TSTR
3660 W=PLCA:GOSUB 3990:W=LEN(S$):GOSUB 3990:FOR I=1 TO LEN(S$):W=ASC(MID$(S$,I)):GOSUB 3990:NEXT I:GOSUB 1400:RETURN
3670 T0=ID:GOSUB 1950
3680 GOSUB 3890:IF KIND=0 THEN TSP=TSP+1:TY(TSP)=TYPE:TN=CONST:GOSUB 3640:GOSUB 1400:RETURN
3682 GOSUB 1400:IF T=SQUOTE THEN 3780
3685 IF KIND=4 THEN X=TYPE:GOSUB 4280:T0=LP:GOSUB 1960:GOSUB 3100:T0=RP:GOSUB 1960:GOSUB 4300:TY(TSP)=X:RETURN
3690 TSP=TSP+1:TY(TSP)=TYPE:IF TYPE=0 THEN 3800
3700 IF KIND<>1 THEN 3740 ELSE GOSUB 4060
3710 T0=LP:GOSUB 1960
3720 GOSUB 3100:IF TY(TSP)<>TINT THEN E=9:GOTO 5020 ELSE TSP=TSP-1:W=PIND:GOSUB 3990:W=PSINDO:GOSUB 3990
3730 T0=RP:GOSUB 1960:RETURN
3740 IF KIND<>3 THEN GOSUB 3760:RETURN ELSE X=ADDR:GOSUB 4280:X=LEX:GOSUB 4280
3745 IF T=LP THEN GOSUB 1400:GOSUB 3570:T0=RP:GOSUB 1960
3750 GOSUB 4100:RETURN
3760 GOSUB 3820:IF PINFO=2 THEN W=PSINDO:GOSUB 3990
3770 RETURN
3780 TSP=TSP+1:TY(TSP)=TINT:GOSUB 1400:IF T=KLAST THEN W=PLDCI:GOSUB 3990:W=CONST:GOSUB 4030:GOTO 3790
3785 IF T=KLEN THEN GOSUB 4060:W=PLDB:GOSUB 3990 ELSE E=7:GOTO 5020
3790 GOSUB 1400:RETURN
3800 IF KIND<>1 THEN 3810 ELSE GOSUB 4060:X=OBJSZ:GOSUB 4280:T0=LP:GOSUB 1960:GOSUB 3100
3805 IF TY(TSP)<>TINT THEN E=9:GOTO 5020 ELSE TSP=TSP-1:GOSUB 4300:W=PIXA:GOSUB 3990:W=X:GOSUB 3990:T0=RP:GOSUB 1960:RETURN
3810 GOSUB 4060:RETURN
3820 '********** LD Val
3830 IF LEX=1 THEN 3831 ELSE IF LEX=LL THEN 3834 ELSE W=PLOD:GOSUB 3990:W=LL-LEX:GOTO 3845
3831 '********** Global
3832 IF ADDR<256 THEN W=PSLDO:GOTO 3840 ELSE W=PLDO:GOTO 3845
3834 '********** LDL
3835 IF ADDR>=0 AND ADDR<8 THEN W=PSLDLO+ADDR:GOSUB 3990:RETURN
3836 IF ADDR>0 AND ADDR<8 THEN W=PSLDL:GOTO 3840 ELSE W=PLDL:GOTO 3845
3840 '********** B,B
3842 GOSUB 3990:W=ADDR:GOSUB 3990:RETURN
3845 '********** B,W
3847 GOSUB 3990:W=ADDR:GOSUB 4030:RETURN
3850 '********** Add ID
3860 IF LEN(S$(SSP))+17>255 THEN SSP=SSP+1
3870 S$(SSP)=ID$+CHR$(TYPE)+CHR$(KIND)+CHR$(PINFO)+MKI$(CONST)+CHR$(OBJSZ)+MKI$(ADDR)+CHR$(LL)+S$(SSP)
3880 RETURN
3890 '********** Lookup ID
3900 LOC1=SSP
3910 LOC2=INSTR(S$(LOC1),ID$):IF LOC2 THEN 3920 ELSE LOC1=LOC1-1:IF LOC1 THEN 3910 ELSE E=2::GOTO 5020
3920 T9=VARPTR(S$(LOC1)):POKE VLOC,PEEK(T9+1):POKE VLOC1,PEEK(T9+2):T9=V+LOC2-1
3930 TYPE=PEEK(T9+8):KIND=PEEK(T9+9):PINFO=PEEK(T9+10):POKE VLOC,PEEK(T9+11):POKE VLOC1,PEEK(T9+12):CONST=V
3960 OBJSZ=PEEK(T9+13):LEX=PEEK(T9+16):POKE VLOC,PEEK(T9+14):POKE VLOC1,PEEK(T9+15):ADDR=V:RETURN
3990 '********** GenByte
4000 GOSUB 4140:FIELD #1,R2 AS D$,1 AS D$:LSET D$=CHR$(W):CP=CP+1:RETURN
4010 '********** read wrd
4020 T1=CP:GOSUB 4260:POKE VLOC,W:CP=CP+1:GOSUB 4260:POKE VLOC1,W:W=V:CP=T1:RETURN
4030 '********** GenWord W
4040 GOSUB 4140:IF R2<127 THEN FIELD #1,R2 AS D$,2 AS D$:LSET D$=MKI$(W):CP=CP+2:RETURN
4050 V=W:W=PEEK(VLOC):GOSUB 3990:W=PEEK(VLOC1):GOSUB 3990:RETURN
4060 '********** LD Adr
4070 IF PINFO=2 THEN GOSUB 3820 RETURN
4080 IF LEX=1 THEN 4085 ELSE IF LEX=LL THEN 4090 ELSE W=PLDA:GOSUB 3990:W=LL-LEX:GOTO 3845
4085 '********** GL Adr
4087 IF ADDR<256 THEN W=PSLAO:GOTO 3840 ELSE W=PLAO:GOTO 3845
4090 '********** LDL Adr
4095 IF ADDR>=0 AND ADDR<256 THEN W=PSLLA:GOTO 3840 ELSE W=PLLA:GOTO 3845
4100 '********** Call Proc
4110 GOSUB 4300:LEX=X:GOSUB 4300:ADDR=X
4120 IF LEX=0 THEN W=PCSP ELSE IF LEX=2 THEN W=PCGP ELSE IF LEX=LL+1 THEN W=PCLP ELSE W=PCIP
4130 GOSUB 3990:W=ADDR:GOSUB 3990:RETURN
4140 '********** GetBuf
4150 T9=CP+CB:R1=T9\128+1:R2=T9 AND 127:IF R1=R0 THEN RETURN
4160 FIELD #1,128 AS D$:J=1
4170 IF B(J)=R0 OR B(J)=0 THEN 4190 ELSE J=J+1:IF J<=MB THEN 4170
4180 LSET B$(0)=D$:J=INT(RND*MB)+1:LSET D$=B$(J):PUT #1,B(J):LSET B$(J)=B$(0):B(J)=R0:GOTO 4200
4190 LSET B$(J)=D$:B(J)=R0
4200 J=1
4210 IF B(J)=R1 THEN 4240 ELSE J=J+1:IF J<=MB THEN 4210
4220 GET #1,R1:R0=R1:IF R1>M0 THEN M0=R1
4230 RETURN
4240 LSET D$=B$(J):R0=R1:IF R1>M0 THEN M0=R1
4250 RETURN
4260 '********** ReadByte
4270 GOSUB 4140:FIELD #1,R2 AS D$,1 AS D$:W=ASC(D$):RETURN
4280 '********** Push
4290 S(SP)=X:SP=SP+1:RETURN
4300 '********** Pop
4310 SP=SP-1:X=S(SP):RETURN
4320 '********** Loop
4330 IF T<>KWHILE THEN 4370
4340 GOSUB 1400:X=CP:GOSUB 4280:GOSUB 3100:GOSUB 4930
4350 W=PFJP:GOSUB 3990:X=CP:GOSUB 4280:W=0:GOSUB 4030:GOSUB 4590:GOSUB 4300
4360 T1=CP:CP=X:W=T1-X+1:GOSUB 4030:CP=T1:W=PUJP:GOSUB 3990:GOSUB 4300:W=X-CP-2:GOSUB 4030:GOSUB 4620:RETURN
4370 IF T<>KFOR THEN 4580
4380 GOSUB 1400:T0=ID:GOSUB 1950:X=OFST:GOSUB 4280:GOSUB 5400
4390 ADDR=OFST:TYPE=1:KIND=5:PINFO=0:GOSUB 3850
4400 GOSUB 1400:T0=KIN:GOSUB 1960
4410 IF T=KREVERSE THEN X=-1:GOSUB 1400 ELSE X=1
4420 GOSUB 4280:W=PLLA:GOSUB 3990:W=OFST:GOSUB 4030
4430 GOSUB 3290:GOSUB 4960:W=PSTO:GOSUB 3990
4440 X=CP:GOSUB 4280:W=PLDL:GOSUB 3990:W=OFST:GOSUB 4030
4450 T0=DOTDOT:GOSUB 1960:GOSUB 3290:GOSUB 4960
4460 GOSUB 4300:T1=X:GOSUB 4300:IF X<0 THEN W=PGEQI ELSE W=PLEQI
4470 GOSUB 3990:W=PFJP:GOSUB 3990:GOSUB 4280:X=T1:GOSUB 4280
4480 X=CP:GOSUB 4280:W=0:GOSUB 4030:X=OFST:GOSUB 4280:OFST=OFST+2:GOSUB 4990
4490 GOSUB 4590:GOSUB 4300:T3=X:GOSUB 4300:T1=X:GOSUB 4300:T2=X:GOSUB 4300:IF X<0 THEN W=PDECL ELSE W=PINCL
4500 GOSUB 3990:W=T3:GOSUB 4030
4520 W=PUJP:GOSUB 3990
4530 W=T2-CP-2:GOSUB 4030:T2=CP:CP=T1:W=T2-T1-2:GOSUB 4030:CP=T2
4550 GOSUB 5500:GOSUB 5700
4560 GOSUB 4300:OFST=X
4570 GOSUB 4620:RETURN
4580 X=CP:GOSUB 4280:GOSUB 4590:W=PUJP:GOSUB 3990:GOSUB 4300:W=X-CP-2:GOSUB 4030:GOSUB 4620:RETURN
4590 T0=KLOOP:GOSUB 1960:X=XITJP:GOSUB 4280:XITJP=0:X=LPFLG:GOSUB 4280:LPFLG=-1:GOSUB 2810
4600 T0=KEND:GOSUB 1960
4610 T0=KLOOP:GOSUB 1960:GOSUB 4300:T5=X:GOSUB 4300:T6=X:GOSUB 3420:RETURN
4620 T2=CP:WHILE XITJP<>0:CP=XITJP:GOSUB 4010:XITJP=W:W=T2-CP-2:GOSUB 4030:WEND:CP=T2:LPFLG=T5:XITJP=T6:RETURN
4630 '********** Case
4640 GOSUB 1400:GOSUB 3100:IF TY(TSP)<>TINT AND TY(TSP)<>TCHR THEN E=9:GOTO 5020
4645 TSP=TSP-1:W=PXJP:GOSUB 3990:X=CP:GOSUB 4280:GOSUB 4030:GOSUB 4030:GOSUB 4030:CASES=0:LUJP=0:T0=KIS:GOSUB 1960
4650 T0=KWHEN:GOSUB 1960:IF T=KOTHERS THEN 4810 ELSE T1=0
4660 IF T=ID THEN GOSUB 3890:TN=CONST:IF TYPE=1 OR TYPE=2 THEN T=C
4670 IF T<>CH AND T<>C THEN E=5:GOTO 5020 ELSE X=TN:GOSUB 4280:T1=T1+1:GOSUB 1400:IF T=BAR THEN GOSUB 1400:GOTO 4660
4680 GOSUB 4780
4690 IF T=KWHEN THEN 4650 ELSE X=0:GOSUB 4280:GOSUB 4280:X=1:GOSUB 4280:CASES=CASES+1
4700 T0=KEND:GOSUB 1960:T0=KCASE:GOSUB 1960
4710 T1=SP-4:T3=32767:T4=-32767:FOR I=1 TO CASES-1:T2=S(T1):T1=T1-2:FOR J=1 TO T2:IF S(T1)<T3 THEN T3=S(T1)
4715 IF S(T1)>T4 THEN T4=S(T1)
4720 T1=T1-1:NEXT J:NEXT I:W=PUJP:GOSUB 3990:T5=CP:GOSUB 4300:GOSUB 4300:T1=X:GOSUB 4300
4725 IF X=-1 THEN W=T1-CP-2:GOSUB 4030 ELSE W=LUJP:LUJP=CP:GOSUB 4030
4730 FOR I=T3 TO T4:W=T5-CP-3:GOSUB 4030:NEXT I '*** build table
4740 T7=CP:FOR I=1 TO CASES-1:GOSUB 4300:T2=X:GOSUB 4300:T6=X:FOR T8=1 TO T2:GOSUB 4300
4745 CP=T5+(X-T3)*2+2:W=T6-CP-2:GOSUB 4030:NEXT T8:NEXT I:CP=T7
4750 GOSUB 4300:T2=CP:CP=X:W=T3:GOSUB 4030:W=T4:GOSUB 4030:W=T5-CP-2:GOSUB 4030
4760 WHILE LUJP<>0:CP=LUJP:GOSUB 4010:LUJP=W:W=T2-CP-2:GOSUB 4030:WEND:CP=T2
4770 GOSUB 3420:RETURN
4780 T0=EQGT:GOSUB 1960:X=CP:GOSUB 4280:X=T1:GOSUB 4280:X=LUJP:GOSUB 4280:CASES=CASES+1:X=CASES:GOSUB 4280:GOSUB 2810
4790 W=PUJP:GOSUB 3990:GOSUB 4300:CASES=X:GOSUB 4300:LUJP=X
4800 W=LUJP:LUJP=CP:GOSUB 4030:RETURN
4810 '********** Others
4820 GOSUB 1400:X=-1:GOSUB 4280:T1=1:GOSUB 4780:GOTO 4700
4830 '********** Pragma
4840 GOSUB 1400:IF S$<>"LIST" THEN 4850
4845 GOSUB 4880:IF T$="ON" THEN PLST=-1:LPRINT LP$;:RETURN ELSE IF T$="OFF" THEN PLST=0:RETURN ELSE E=6:GOTO 5020
4850 IF S$="CRT" THEN GOSUB 4880:IF T$="ON" THEN CLST=-1:RETURN ELSE CLST=0:RETURN
4860 IF S$<>"INCLUDE" THEN RETURN ELSE GOSUB 1400:T0=LP:GOSUB 1960
4870 IF T<>SC THEN E=9:GOTO 5020 ELSE GOSUB 1230:GOSUB 1400:T0=RP:GOSUB 1960:RETURN
4880 GOSUB 1400:T0=LP:GOSUB 1960:T$=S$:GOSUB 1400:T0=RP:GOSUB 1960:RETURN
4910 '********** WriteProc
4920 T2=CP:T3=CB:CB=0:CP=(ADDR-1)*7+128:W=C1-1920:GOSUB 4030:W=L1:GOSUB 4030:W=P1:GOSUB 4030:W=LL:GOSUB 3990:CP=T2:CB=T3:RETURN
4930 '********** Check Bool
4940 IF TY(TSP)<>TBOL THEN E=9:GOTO 5020
4950 TSP=TSP-1:RETURN
4960 '********** Check Int
4970 IF TY(TSP)<>TINT THEN E=9:GOTO 5020
4980 TSP=TSP-1:RETURN
4990 '********** Max Offst
5000 IF OFST>MXOF THEN MXOF=OFST
5010 RETURN
5020 GOSUB 5100:STOP
5100 PRINT:PRINT"*** Error";E;" in line";LN:PRINT BUF$:PRINT TAB(B-1);"*":RETURN
5110 PRINT:PRINT T0;" expected":GOSUB 5100:RETURN
5200 '********** Proc DEF
5210 LL=LL+1:X=CPROC:GOSUB 4280:X=OFST:GOSUB 4280:X=MXOF:GOSUB 4280:T0=ID:GOSUB 1950
5220 GOSUB 5400:RETURN
5300 '********** Proc END DEF
5310 W=PEOP:GOSUB 3990:GOSUB 4300:P1=X:GOSUB 4300:ADDR=X:CPROC=X:L1=MXOF:C1=GC:GOSUB 4910:GC=GC+CP
5320 LL=LL-1:GOSUB 5500:GOSUB 5600
5330 GOSUB 4300:MXOF=X:GOSUB 4300:OFST=X:GOSUB 4300:CPROC=X:RETURN
5400 '********** Push Syms
5410 X=LEN(S$(SSP)):IF X=255 THEN SSP=SSP+1:X=0
5420 GOSUB 4280:X=SSP:GOSUB 4280:RETURN
5500 '********** Pop Syms
5510 GOSUB 4300:FOR I=X+1 TO SSP:S$(I)="":NEXT I:SSP=X:GOSUB 4300:LOC2=X:RETURN
5520 RETURN
5600 S$(SSP)=RIGHT$(S$(SSP),LOC2+17):RETURN
5700 S$(SSP)=RIGHT$(S$(SSP),LOC2):RETURN
32767 KEY ON: END